load("//lib/prolog:prolog.bzl", "prolog_cafe_library")
load("//tools/bzl:junit.bzl", "junit_tests")

CONSTANTS_SRC = [
    "src/main/java/com/google/gerrit/server/documentation/Constants.java",
]

GERRIT_GLOBAL_MODULE_SRC = [
    "src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java",
]

# Non-recursive glob; dropwizard implementation is in a subpackage.
METRICS_SRCS = glob(["src/main/java/com/google/gerrit/metrics/*.java"])

RECEIVE_SRCS = glob(["src/main/java/com/google/gerrit/server/git/receive/**/*.java"])

SRCS = glob(
    ["src/main/java/**/*.java"],
    exclude = CONSTANTS_SRC + GERRIT_GLOBAL_MODULE_SRC + METRICS_SRCS + RECEIVE_SRCS,
)

RESOURCES = glob(["src/main/resources/**/*"])

java_library(
    name = "constants",
    srcs = CONSTANTS_SRC,
    visibility = ["//visibility:public"],
)

prolog_cafe_library(
    name = "prolog-common",
    srcs = ["src/main/prolog/gerrit_common.pl"],
    visibility = ["//visibility:public"],
    deps = [":server"],
)

# Giant kitchen-sink target.
#
# The only reason this hasn't been split up further is because we have too many
# tangled dependencies (and Guice unfortunately makes it quite easy to get into
# this state). Which means if you see an opportunity to split something off, you
# should seize it.
java_library(
    name = "server",
    srcs = SRCS,
    resources = RESOURCES,
    visibility = ["//visibility:public"],
    deps = [
        ":constants",
        ":metrics",
        "//gerrit-common:annotations",
        "//gerrit-common:server",
        "//gerrit-extension-api:api",
        "//gerrit-index:index",
        "//gerrit-index:query_exception",
        "//gerrit-patch-commonsnet:commons-net",
        "//gerrit-patch-jgit:server",
        "//gerrit-prettify:server",
        "//gerrit-reviewdb:server",
        "//gerrit-util-cli:cli",
        "//gerrit-util-ssl:ssl",
        "//lib:args4j",
        "//lib:automaton",
        "//lib:blame-cache",
        "//lib:grappa",
        "//lib:gson",
        "//lib:guava",
        "//lib:guava-retrying",
        "//lib:gwtjsonrpc",
        "//lib:gwtorm",
        "//lib:jsch",
        "//lib:juniversalchardet",
        "//lib:mime-util",
        "//lib:pegdown",
        "//lib:protobuf",
        "//lib:servlet-api-3_1",
        "//lib:soy",
        "//lib:tukaani-xz",
        "//lib:velocity",
        "//lib/auto:auto-value",
        "//lib/bouncycastle:bcpkix-neverlink",
        "//lib/bouncycastle:bcprov-neverlink",
        "//lib/commons:codec",
        "//lib/commons:compress",
        "//lib/commons:dbcp",
        "//lib/commons:lang",
        "//lib/commons:net",
        "//lib/commons:validator",
        "//lib/dropwizard:dropwizard-core",
        "//lib/guice",
        "//lib/guice:guice-assistedinject",
        "//lib/guice:guice-servlet",
        "//lib/jgit/org.eclipse.jgit.archive:jgit-archive",
        "//lib/jgit/org.eclipse.jgit:jgit",
        "//lib/joda:joda-time",
        "//lib/jsoup",
        "//lib/log:api",
        "//lib/log:jsonevent-layout",
        "//lib/log:log4j",
        "//lib/lucene:lucene-analyzers-common",
        "//lib/lucene:lucene-core-and-backward-codecs",
        "//lib/lucene:lucene-queryparser",
        "//lib/mime4j:core",
        "//lib/mime4j:dom",
        "//lib/ow2:ow2-asm",
        "//lib/ow2:ow2-asm-tree",
        "//lib/ow2:ow2-asm-util",
        "//lib/prolog:runtime",
    ],
)

# Large modules that import things from all across the server package
# hierarchy, so they need lots of dependencies.
java_library(
    name = "module",
    srcs = GERRIT_GLOBAL_MODULE_SRC,
    visibility = ["//visibility:public"],
    deps = [
        ":receive",
        ":server",
        "//gerrit-extension-api:api",
        "//lib:blame-cache",
        "//lib:guava",
        "//lib:soy",
        "//lib:velocity",
        "//lib/guice",
        "//lib/jgit/org.eclipse.jgit:jgit",
    ],
)

java_library(
    name = "receive",
    srcs = RECEIVE_SRCS,
    visibility = ["//visibility:public"],
    deps = [
        ":server",
        "//gerrit-common:annotations",
        "//gerrit-common:server",
        "//gerrit-extension-api:api",
        "//gerrit-reviewdb:server",
        "//gerrit-util-cli:cli",
        "//lib:args4j",
        "//lib:guava",
        "//lib:gwtorm",
        "//lib/auto:auto-value",
        "//lib/guice",
        "//lib/guice:guice-assistedinject",
        "//lib/jgit/org.eclipse.jgit:jgit",
        "//lib/log:api",
    ],
)

# TODO(dborowitz): Move to a different top-level directory to avoid inbound
# dependencies on gerrit-server.
java_library(
    name = "metrics",
    srcs = METRICS_SRCS,
    visibility = ["//visibility:public"],
    deps = [
        "//gerrit-extension-api:api",
        "//lib:guava",
    ],
)

TESTUTIL_DEPS = [
    ":metrics",
    ":module",
    ":server",
    "//gerrit-common:annotations",
    "//gerrit-common:server",
    "//gerrit-cache-h2:cache-h2",
    "//gerrit-extension-api:api",
    "//gerrit-gpg:gpg",
    "//gerrit-index:index",
    "//gerrit-lucene:lucene",
    "//gerrit-reviewdb:server",
    "//lib:gwtorm",
    "//lib:h2",
    "//lib:truth",
    "//lib/guice:guice",
    "//lib/guice:guice-servlet",
    "//lib/jgit/org.eclipse.jgit:jgit",
    "//lib/jgit/org.eclipse.jgit.junit:junit",
    "//lib/joda:joda-time",
    "//lib/log:api",
    "//lib/log:impl_log4j",
    "//lib/log:log4j",
]

TESTUTIL = glob([
    "src/test/java/com/google/gerrit/testutil/**/*.java",
    "src/test/java/com/google/gerrit/server/project/Util.java",
])

java_library(
    name = "testutil",
    testonly = 1,
    srcs = TESTUTIL,
    visibility = ["//visibility:public"],
    exports = [
        "//lib/easymock",
        "//lib/powermock:powermock-api-easymock",
        "//lib/powermock:powermock-api-support",
        "//lib/powermock:powermock-core",
        "//lib/powermock:powermock-module-junit4",
        "//lib/powermock:powermock-module-junit4-common",
    ],
    deps = TESTUTIL_DEPS + [
        "//gerrit-pgm:init",
        "//lib/auto:auto-value",
        "//lib/easymock:easymock",
        "//lib/powermock:powermock-api-easymock",
        "//lib/powermock:powermock-api-support",
        "//lib/powermock:powermock-core",
        "//lib/powermock:powermock-module-junit4",
        "//lib/powermock:powermock-module-junit4-common",
    ],
)

CUSTOM_TRUTH_SUBJECTS = glob([
    "src/test/java/com/google/gerrit/server/**/*Subject.java",
])

java_library(
    name = "custom-truth-subjects",
    testonly = 1,
    srcs = CUSTOM_TRUTH_SUBJECTS,
    deps = [
        ":server",
        "//gerrit-extension-api:api",
        "//gerrit-test-util:test_util",
        "//lib:truth",
    ],
)

PROLOG_TEST_CASE = [
    "src/test/java/com/google/gerrit/rules/PrologTestCase.java",
]

PROLOG_TESTS = glob(
    ["src/test/java/com/google/gerrit/rules/**/*.java"],
    exclude = PROLOG_TEST_CASE,
)

java_library(
    name = "prolog_test_case",
    testonly = 1,
    srcs = PROLOG_TEST_CASE,
    deps = [
        ":server",
        ":testutil",
        "//gerrit-common:server",
        "//gerrit-extension-api:api",
        "//lib:guava",
        "//lib:junit",
        "//lib:truth",
        "//lib/guice",
        "//lib/prolog:runtime",
    ],
)

junit_tests(
    name = "prolog_tests",
    srcs = PROLOG_TESTS,
    resources = glob(["src/test/resources/com/google/gerrit/rules/**/*"]),
    deps = TESTUTIL_DEPS + [
        ":prolog-common",
        ":prolog_test_case",
        ":testutil",
        "//lib/prolog:runtime",
    ],
)

QUERY_TESTS = glob(
    ["src/test/java/com/google/gerrit/server/query/**/*.java"],
)

java_library(
    name = "query_tests_code",
    testonly = 1,
    srcs = QUERY_TESTS,
    visibility = ["//visibility:public"],
    deps = TESTUTIL_DEPS + [
        ":prolog-common",
        ":testutil",
    ],
)

junit_tests(
    name = "query_tests",
    size = "large",
    srcs = QUERY_TESTS,
    visibility = ["//visibility:public"],
    deps = TESTUTIL_DEPS + [
        ":prolog-common",
        ":testutil",
    ],
)

junit_tests(
    name = "server_tests",
    size = "large",
    srcs = glob(
        ["src/test/java/**/*.java"],
        exclude = TESTUTIL + CUSTOM_TRUTH_SUBJECTS + PROLOG_TESTS + PROLOG_TEST_CASE + QUERY_TESTS,
    ),
    resources = glob(["src/test/resources/com/google/gerrit/server/**/*"]),
    visibility = ["//visibility:public"],
    deps = TESTUTIL_DEPS + [
        ":custom-truth-subjects",
        ":prolog-common",
        ":testutil",
        "//gerrit-index:query_exception",
        "//gerrit-patch-jgit:server",
        "//gerrit-test-util:test_util",
        "//lib:args4j",
        "//lib:grappa",
        "//lib:gson",
        "//lib:guava",
        "//lib:guava-retrying",
        "//lib:protobuf",
        "//lib:truth-java8-extension",
        "//lib/bouncycastle:bcprov",
        "//lib/bouncycastle:bcpkix",
        "//lib/dropwizard:dropwizard-core",
        "//lib/guice:guice-assistedinject",
        "//lib/prolog:runtime",
        "//lib/commons:codec",
    ],
)

junit_tests(
    name = "testutil_test",
    size = "small",
    srcs = [
        "src/test/java/com/google/gerrit/testutil/IndexVersionsTest.java",
    ],
    visibility = ["//visibility:public"],
    deps = TESTUTIL_DEPS + [
        ":testutil",
    ],
)

load("//tools/bzl:javadoc.bzl", "java_doc")

java_doc(
    name = "doc",
    libs = [":server"],
    pkgs = ["com.google.gerrit"],
    title = "Gerrit Review Server Documentation",
)
